#ifndef __LOCK_GUARD_HPP__ // 防止头文件被重复包含的宏定义（Include Guard）
#define __LOCK_GUARD_HPP__

#include <iostream>  // 标准输入输出流，这里没有直接使用，但常用于C++文件
#include <pthread.h> // 包含 POSIX 线程库的头文件，用于 pthread_mutex_t 和相关函数

// LockGuard 类：实现基于 RAII 思想的互斥锁包装
// RAII 是一种 C++ 编程范式，它将资源（如互斥锁）的生命周期与对象的生命周期绑定。
// 当 LockGuard 对象创建时（资源获取），互斥锁被加锁；
// 当 LockGuard 对象超出作用域被销毁时（资源释放），互斥锁自动被解锁。
class LockGuard
{
public:
    // 构造函数：在 LockGuard 对象创建时对传入的互斥锁进行加锁
    // mutex 参数是一个指向 pthread_mutex_t 互斥锁的指针
    LockGuard(pthread_mutex_t *mutex) : _mutex(mutex) // 使用成员初始化列表初始化 _mutex
    {
        // 调用 pthread_mutex_lock 函数对互斥锁进行加锁
        // 这确保了在 LockGuard 对象存在的整个作用域内，受保护的代码块是线程安全的。
        pthread_mutex_lock(_mutex); // 构造加锁
    }

    // 析构函数：在 LockGuard 对象被销毁时对互斥锁进行解锁
    // 无论代码块是正常执行结束，还是因为异常跳出，析构函数都会被调用。
    ~LockGuard()
    {
        // 调用 pthread_mutex_unlock 函数对互斥锁进行解锁
        // 这确保了在离开受保护的代码块时，互斥锁总是会被释放，避免死锁。
        pthread_mutex_unlock(_mutex);
    }

private:
    // _mutex 是私有成员变量，存储指向所保护的互斥锁的指针
    // LockGuard 对象本身不拥有互斥锁的生命周期，它只是管理锁的加锁和解锁操作。
    pthread_mutex_t *_mutex;
};

#endif // __LOCK_GUARD_HPP__